home *** CD-ROM | disk | FTP | other *** search
- #include <Slots.h>
- #include <Retrace.h>
-
- #include "GraphicsModule_Types.h"
- #include "grafstuff.h"
-
- MonitorsInfoPtr gMonitorsInfoPtr;
- MyDeviceDataPtr gMyDDPtr;
-
- OSErr SetupMonitorData(void)
- {
- GDHandle theGD;
- short numGD,indexGD;
- OSErr err;
-
- numGD = 0;
- theGD = GetDeviceList();
- while (theGD) {
- numGD++;
- theGD = GetNextDevice(theGD);
- }
-
- gMonitorsInfoPtr = (MonitorsInfoPtr) NewPtr((numGD*sizeof(MonitorData))+sizeof(short));
- if (MemError()!=noErr)
- return MemError();
- gMyDDPtr = (MyDeviceDataPtr) NewPtr(numGD*sizeof(MyDeviceData));
- if (MemError()!=noErr)
- return MemError();
-
- gMonitorsInfoPtr->monitorCount = numGD;
-
- theGD = GetDeviceList();
- for (indexGD=0; indexGD<numGD; indexGD++) {
- gMyDDPtr[indexGD].theGD = theGD;
- gMonitorsInfoPtr->monitorList[indexGD].bounds = (**theGD).gdRect;
- gMonitorsInfoPtr->monitorList[indexGD].curDepth = GetDepth(theGD);
- gMonitorsInfoPtr->monitorList[indexGD].synchFlag = false;
- err = InstallMonitorVBL(theGD,&gMyDDPtr[indexGD].vbl,&gMonitorsInfoPtr->monitorList[indexGD].synchFlag);
- if (err!=noErr)
- return err;
-
- theGD = GetNextDevice(theGD);
- }
-
- return err;
- }
-
-
- OSErr RemoveMonitorData(void)
- {
- short index;
-
- for (index=0; index<gMonitorsInfoPtr->monitorCount; index++) {
- RemoveMonitorVBL(gMyDDPtr[index].theGD,&gMyDDPtr[index].vbl);
- }
-
- DisposePtr((Ptr)gMonitorsInfoPtr);
- DisposPtr((Ptr)gMyDDPtr);
- return MemError();
- }
-
-
- short GetDepth(GDHandle theGD)
- {
- short compSize;
-
- compSize = (**(**theGD).gdPMap).cmpSize;
- compSize *= (**(**theGD).gdPMap).cmpCount;
-
- return compSize;
- }
-
-
- OSErr InstallMonitorVBL(GDHandle theGD,MyTask *task,Boolean *syncFlag)
- {
- OSErr err;
- short theSlot;
- long vblAddr;
- unsigned short *sysVBL;
-
- vblAddr = (long) StripAddress((Ptr)MySyncVBL);
-
- err = GetSlot(theGD,&theSlot);
- if (err!=noErr)
- return err;
-
- sysVBL = (unsigned short *)NewPtrSys(6);
- sysVBL[0] = 0x4ef9;
- sysVBL[1] = (short) (vblAddr >> 16);
- sysVBL[2] = (short) (vblAddr & 0x0000ffff);
-
- task->syncFlag = syncFlag;
- task->theVBL.vblAddr = (ProcPtr)sysVBL;
- task->theVBL.qType = vType;
- task->theVBL.vblCount = 1;
- task->theVBL.vblPhase = 0;
-
- err = SlotVInstall((QElemPtr)&task->theVBL,theSlot);
- return err;
- }
-
-
- OSErr RemoveMonitorVBL(GDHandle theGD,MyTask *task)
- {
- OSErr err;
- short theSlot;
-
- err = GetSlot(theGD,&theSlot);
- if (err!=noErr)
- return err;
-
- err = SlotVRemove((QElemPtr)&task->theVBL,theSlot);
- return err;
- }
-
-
- OSErr GetSlot(GDHandle theGD,short *theSlot)
- {
- SpBlock spBlock;
- OSErr err;
-
- spBlock.spCategory = 3;
- spBlock.spCType = 1;
- spBlock.spSlot = 0;
- spBlock.spID = 0;
- spBlock.spExtDev = 0;
- spBlock.spTBMask = 3; /* mask off driver */
-
- do {
- err = SNextTypeSRsrc(&spBlock);
- } while (err==noErr && spBlock.spRefNum!=(**theGD).gdRefNum);
-
- *theSlot = spBlock.spSlot;
- return err;
- }
-
-
- pascal void MySyncVBL(void)
- {
- asm {
- move.w #1,10(a0)
- move.l -4(a0),a0
- st (a0)
- }
- }
-
-
- OSErr InitModuleQD(QDGlobalsPtr *retQD)
- {
- QDGlobalsPtr myQD;
- GrafPtr myPort;
- OSErr err;
- RgnHandle theRgn;
-
- *retQD = myQD = (QDGlobalsPtr) NewPtr(sizeof(struct QDGlobals));
- if (MemError()!=noErr)
- return MemError();
-
- GetPort(&myPort);
-
- BlockMove(&qd.white,&myQD->qdWhite,sizeof(Pattern));
- BlockMove(&qd.black,&myQD->qdBlack,sizeof(Pattern));
- BlockMove(&qd.gray,&myQD->qdGray,sizeof(Pattern));
- BlockMove(&qd.ltGray,&myQD->qdLtGray,sizeof(Pattern));
- BlockMove(&qd.dkGray,&myQD->qdDkGray,sizeof(Pattern));
- BlockMove(&qd.arrow,&myQD->qdArrow,sizeof(Cursor));
- BlockMove(&qd.screenBits,&myQD->qdScreenBits,sizeof(BitMap));
- myQD->qdRandSeed = randSeed;
- myQD->qdThePort = myPort;
- }
-
-
- OSErr DisposeModuleQD(QDGlobalsPtr modQD)
- {
- DisposePtr((Ptr)modQD);
- return MemError();
- }
-
-
-